home *** CD-ROM | disk | FTP | other *** search
- #include <stdlib.h>
- #ifdef __GNUC__
- #include <inline/exec.h>
- #include <dos/dos.h>
- #include <inline/dos.h>
- #endif
- #ifndef __GNUC__
- #include <clib/exec_protos.h>
- #include <clib/dos_protos.h>
- #endif
- #include <exec/memory.h>
- #include <workbench/startup.h>
- #include <stabs.h>
-
- extern int __argc; /* Defined in startup */
- extern char **__argv;
- extern char *__commandline;
- extern struct WBStartup *_WBenchMsg;
-
- extern char __stdiowin[];
-
- static char *cline=NULL; /* Copy of commandline */
- static BPTR cd=0l; /* Lock for Current Directory */
- static BPTR window=0l; /* CLI-window for start from workbench */
-
- /* This guarantees that this module gets linked in.
- If you replace this by an own reference called
- __nocommandline you get no commandline arguments */
- ALIAS(__nocommandline,__initcommandline);
-
- void __initcommandline(void)
- {
- if(_WBenchMsg!=NULL)
- { if(__stdiowin[0])
- { if((window=Open(__stdiowin,MODE_OLDFILE))==0l)
- exit(RETURN_FAIL);
- SelectInput(window);
- SelectOutput(window);
- }
- if(_WBenchMsg->sm_ArgList!=NULL) /* cd to icon */
- { cd=DupLock(_WBenchMsg->sm_ArgList->wa_Lock);
- CurrentDir(cd); }
-
- __argc=0;
- __argv=(char **)_WBenchMsg;
- }else
- {
- size_t i;
- char *a;
-
- for(i=0;__commandline[i]!='\n';i++) /* calculate size of commandline */
- ;
- cline=(char *)AllocVec(i+1,MEMF_ANY);
-
- if(cline==NULL)
- exit(RETURN_FAIL);
-
- a=cline; /* and parse it */
- __argc=1;
- while(*__commandline!='\n')
- {
- if(*__commandline!='\"')
- while(*__commandline!='\n'&&*__commandline!=' '&&*__commandline!='\t')
- *a++=*__commandline++;
- else
- { __commandline++;
- while(*__commandline!='\n'&&*__commandline!='\"')
- {
- if(*__commandline=='*')
- if(*++__commandline=='\n')
- break;
- *a++=*__commandline++;
- }
- }
- if(*__commandline!='\n')
- {
- __commandline++;
- while(*__commandline==' '||*__commandline=='\t')
- __commandline++;
- }
- *a++='\0';
- __argc++;
- }
- /* NULL Terminated */
- __argv=(char **)AllocVec((__argc+1)*sizeof(char *),MEMF_ANY|MEMF_CLEAR);
-
- if(__argv==NULL)
- exit(RETURN_FAIL);
-
- a=cline;
- for(i=1;i<__argc;i++)
- {
- __argv[i]=a;
- while(*a++)
- ;
- }
-
- for(i=256;;i+=256) /* try in steps of 256 bytes */
- { *__argv=(char *)AllocVec(i,MEMF_ANY);
- if(*__argv==NULL)
- break;
- GetProgramName(*__argv,i); /* Who am I ? */
- if(IoErr()!=ERROR_LINE_TOO_LONG)
- break;
- FreeVec(*__argv);
- }
-
- if(*__argv==NULL)
- exit(RETURN_FAIL);
- }
- }
-
- void __exitcommandline(void)
- {
- if(_WBenchMsg!=NULL)
- {
- if(window!=0l)
- Close(window);
-
- if(cd!=0) /* We locked a directory, it must be unlocked */
- { CurrentDir(0l);
- UnLock(cd); } /* the lock must not be used after it is unlocked!!!! */
- }else
- {
- if(cline!=NULL)
- {
- if(__argv!=NULL)
- {
- if(*__argv!=NULL)
- FreeVec(*__argv);
- FreeVec(__argv);
- }
- FreeVec(cline);
- }
- }
- }
-
- /* Add these two functions to the lists */
- ADD2INIT(__initcommandline,-40);
- ADD2EXIT(__exitcommandline,-40);
-